package com.btm.btmchat.service;

import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 聊天会话管理器，用于管理多轮对话的会话状态
 */
@Component
public class ChatSessionManager {

    // 使用ConcurrentHashMap存储会话，确保线程安全
    private final Map<String, List<Message>> sessionMessages = new ConcurrentHashMap<>();
    
    /**
     * 创建新的会话
     * @return 新会话的ID
     */
    public String createSession() {
        String sessionId = UUID.randomUUID().toString();
        sessionMessages.put(sessionId, new ArrayList<>());
        return sessionId;
    }
    
    /**
     * 添加用户消息到指定会话
     * @param sessionId 会话ID
     * @param content 用户消息内容
     */
    public void addUserMessage(String sessionId, String content) {
        List<Message> messages = getOrCreateSession(sessionId);
        messages.add(new UserMessage(content));
    }
    
    /**
     * 获取指定会话的所有消息
     * @param sessionId 会话ID
     * @return 会话中的消息列表
     */
    public List<Message> getMessages(String sessionId) {
        return getOrCreateSession(sessionId);
    }
    
    /**
     * 获取现有会话或创建新会话
     * @param sessionId 会话ID
     * @return 会话中的消息列表
     */
    private List<Message> getOrCreateSession(String sessionId) {
        if (sessionId == null || !sessionMessages.containsKey(sessionId)) {
            String newSessionId = sessionId == null ? createSession() : sessionId;
            sessionMessages.putIfAbsent(newSessionId, new ArrayList<>());
            return sessionMessages.get(newSessionId);
        }
        return sessionMessages.get(sessionId);
    }
    
    /**
     * 清除指定会话
     * @param sessionId 会话ID
     */
    public void clearSession(String sessionId) {
        sessionMessages.remove(sessionId);
    }
    
    /**
     * 检查会话是否存在
     * @param sessionId 会话ID
     * @return 会话是否存在
     */
    public boolean sessionExists(String sessionId) {
        return sessionId != null && sessionMessages.containsKey(sessionId);
    }
}